package cn.ecommerce.course.module.users.utils;

import org.springframework.stereotype.Component;

import java.util.regex.Pattern;

/**
 * 手机号验证工具类
 * 
 * @author ecommerce-course
 */
@Component
public class PhoneValidationUtils {

    /**
     * 中国大陆手机号正则表达式
     * 规则：
     * 1. 以1开头
     * 2. 第二位为3-9
     * 3. 总共11位数字
     */
    private static final String CHINA_MOBILE_REGEX = "^1[3-9]\\d{9}$";
    
    /**
     * 更严格的中国大陆手机号正则表达式
     * 包含具体的运营商号段
     */
    private static final String CHINA_MOBILE_STRICT_REGEX = 
        "^1(3[0-9]|4[01456879]|5[0-35-9]|6[2567]|7[0-8]|8[0-9]|9[0-35-9])\\d{8}$";
    
    /**
     * 国际手机号正则表达式（支持+86等国际格式）
     */
    private static final String INTERNATIONAL_MOBILE_REGEX = 
        "^(\\+86)?1[3-9]\\d{9}$";
    
    // 编译正则表达式模式，提高性能
    private static final Pattern CHINA_MOBILE_PATTERN = Pattern.compile(CHINA_MOBILE_REGEX);
    private static final Pattern CHINA_MOBILE_STRICT_PATTERN = Pattern.compile(CHINA_MOBILE_STRICT_REGEX);
    private static final Pattern INTERNATIONAL_MOBILE_PATTERN = Pattern.compile(INTERNATIONAL_MOBILE_REGEX);
    
    /**
     * 验证是否为有效的中国大陆手机号（基础验证）
     * 
     * @param phone 手机号
     * @return true-有效，false-无效
     */
    public static boolean isValidChinaMobile(String phone) {
        if (phone == null || phone.trim().isEmpty()) {
            return false;
        }
        return CHINA_MOBILE_PATTERN.matcher(phone.trim()).matches();
    }
    
    /**
     * 验证是否为有效的中国大陆手机号（严格验证，包含运营商号段）
     * 
     * @param phone 手机号
     * @return true-有效，false-无效
     */
    public static boolean isValidChinaMobileStrict(String phone) {
        if (phone == null || phone.trim().isEmpty()) {
            return false;
        }
        return CHINA_MOBILE_STRICT_PATTERN.matcher(phone.trim()).matches();
    }
    
    /**
     * 验证是否为有效的国际手机号（支持+86格式）
     * 
     * @param phone 手机号
     * @return true-有效，false-无效
     */
    public static boolean isValidInternationalMobile(String phone) {
        if (phone == null || phone.trim().isEmpty()) {
            return false;
        }
        return INTERNATIONAL_MOBILE_PATTERN.matcher(phone.trim()).matches();
    }
    
    /**
     * 格式化手机号（去除+86前缀，保留11位数字）
     * 
     * @param phone 原始手机号
     * @return 格式化后的手机号
     */
    public static String formatPhone(String phone) {
        if (phone == null || phone.trim().isEmpty()) {
            return phone;
        }
        
        String cleanPhone = phone.trim().replaceAll("\\s+", "");
        
        // 去除+86前缀
        if (cleanPhone.startsWith("+86")) {
            cleanPhone = cleanPhone.substring(3);
        } else if (cleanPhone.startsWith("86") && cleanPhone.length() == 13) {
            cleanPhone = cleanPhone.substring(2);
        }
        
        return cleanPhone;
    }
    
    /**
     * 隐藏手机号中间4位数字
     * 
     * @param phone 手机号
     * @return 隐藏后的手机号，如：138****1234
     */
    public static String maskPhone(String phone) {
        if (!isValidChinaMobile(phone)) {
            return phone;
        }
        
        String cleanPhone = formatPhone(phone);
        if (cleanPhone.length() == 11) {
            return cleanPhone.substring(0, 3) + "****" + cleanPhone.substring(7);
        }
        
        return phone;
    }
    
    /**
     * 获取手机号运营商类型
     * 
     * @param phone 手机号
     * @return 运营商类型
     */
    public static String getCarrierType(String phone) {
        if (!isValidChinaMobile(phone)) {
            return "未知";
        }
        
        String cleanPhone = formatPhone(phone);
        String prefix = cleanPhone.substring(0, 3);
        
        // 中国移动
        if (prefix.matches("^(134|135|136|137|138|139|147|150|151|152|157|158|159|178|182|183|184|187|188|198)$")) {
            return "中国移动";
        }
        // 中国联通
        else if (prefix.matches("^(130|131|132|145|155|156|166|175|176|185|186)$")) {
            return "中国联通";
        }
        // 中国电信
        else if (prefix.matches("^(133|149|153|173|177|180|181|189|199)$")) {
            return "中国电信";
        }
        // 虚拟运营商
        else if (prefix.matches("^(170|171)$")) {
            return "虚拟运营商";
        }
        
        return "未知";
    }
}